
#include "RuningQueue.hpp"
#include <string>
#include <unistd.h>

// 在使用互斥锁时
// 未关闭锁，就销毁锁————程序将引发未定义行为，具体行为包括：
// RAII守卫类——LockGuard的析构写成销毁锁（本来应该是关闭锁）
// 等待类的生命周期结束，自动调用锁的析构，释放锁
// 可能会导致死锁（程序崩溃），这也是我范的问题
// 也可能会导致：数据竞争，数据不一致
// 还有资源泄漏（锁未被操作系统回收）
struct threaddata
{
    RunningQueue<int> *rq;
    std::string name;
    // threaddata(std::string _n,RunningQueue<int>* t)
    // {
    //     name=_n;
    //     rq=t;
    // }
};

void *consumer(void *args)
{
    // 消费者调用
    // RunningQueue<int>* rq=static_cast<RunningQueue<int>*>(args);
    threaddata *td = static_cast<threaddata *>(args);
    while (true)
    {
        int t = 0;
        td->rq->Pop(&t);
        std::cout << "消费者" << td->name << "消费一个数据：" << t << std::endl;
    }
}
int data = 1;
void *product(void *args)
{
    // 生产者调用
    // RunningQueue<int>* rq=static_cast<RunningQueue<int>*>(args);
    threaddata *td = static_cast<threaddata *>(args);
    while (true)
    {
        sleep(1);
        std::cout << "生产者" << td->name << "生产了一个数据：" << data << std::endl;
        td->rq->Enque(data);
        data++;
    }
}
int main()
{
    // 申请一个环形队列
    RunningQueue<int> *rq = new RunningQueue<int>();
    // 多生产者多消费者
    pthread_t c[2], p[3];

    threaddata *td = new threaddata();
    td->name = "cthread-1";
    td->rq = rq;
    pthread_create(c, nullptr, consumer, td);

    threaddata *td2 = new threaddata();
    td2->name = "cthread-2";
    td2->rq = rq;
    pthread_create(c + 1, nullptr, consumer, td2);

    threaddata *td3 = new threaddata();
    td3->name = "pthread-3";
    td3->rq = rq;
    pthread_create(p, nullptr, product, td3);

    threaddata *td4 = new threaddata();
    td4->name = "pthread-4";
    td4->rq = rq;
    pthread_create(p + 1, nullptr, product, td4);

    threaddata *td5 = new threaddata();
    td5->name = "pthread-5";
    td5->rq = rq;
    pthread_create(p + 2, nullptr, product, td5);

    pthread_join(c[0], nullptr);
    pthread_join(c[1], nullptr);
    pthread_join(p[0], nullptr);
    pthread_join(p[1], nullptr);
    pthread_join(p[2], nullptr);
    return 0;
}

// int data=1;
// void* consumer(void* args)
// {
//     //消费者调用
//     RunningQueue<int>* rq=static_cast<RunningQueue<int>*>(args);
//     while(true)
//     {
//         int t=0;
//         rq->Pop(&t);
//         std::cout<<"消费一个数据："<<t<<std::endl;
//     }
//     return nullptr;
// }

// void* product(void* args)
// {
//     //生产者调用
//     RunningQueue<int>* rq=static_cast<RunningQueue<int>*>(args);

//     while(true)
//     {
//         //sleep(1);
//         std::cout<<"生产了一个数据："<<data<<std::endl;
//         rq->Enque(data);
//         data++;
//     }
//     return nullptr;
// }
// int main()
// {
//     //申请一个环形队列
//     RunningQueue<int>* rq=new RunningQueue<int>();
//     //单生产者和单消费者
//     pthread_t c,p;
//     pthread_create(&p,nullptr,product,rq);
//     pthread_create(&c,nullptr,consumer,rq);

//     pthread_join(p,nullptr);
//     pthread_join(c,nullptr);

//     return 0;
// }